grammar Flex;

options {
  language = Java;
  k = 10;
}
@lexer::header {
   package flexgram;
}
@header {
   package flexgram;
}
fragment LETRA: ('a'..'z' |'A'..'Z' );
fragment DIGIT: ('0'..'9');
BLOQOP: '%{' NEWLINE;
BLOQCL: '%}' NEWLINE;

INT: DIGIT+;  
NEWLINE : '\r'? '\n' ;
IDENT : (LETRA | '_') (LETRA|DIGIT|'_'|'-')*;
SPACE : (' ' |'\t')+;
//WS : (' '|'\t' |'\n' |'\r' )+;
SECCION : '%%' NEWLINE;
COMENTARIO : '/*' (options {greedy=false;}:.)* '*/'; 
EXPCHARS : (LETRA|DIGIT|'{'|'}'|'('|')'|'*'|'+'|'?')* ; 
BLOQUE: BLOQOP (options {greedy=false;}:.)* BLOQCL;

fichero : definiciones (BLOQUE)? COMENTARIO? SECCION;
//reglas (SECCION codigo)?;
definiciones : (COMENTARIO* definicion)+;
definicion : name SPACE valor;
name : IDENT;
valor : (options {greedy=false;}:.)* NEWLINE ;
reglas : regla+ ;

regla :  patron SPACE accion ;
patron : EXPCHARS ;
accion : (options {greedy=false;}:.)* NEWLINE ;


//patron: (options {greedy=false;}:.)* SPACE;
//accion: ~WS (options {greedy=false;}:.)* NEWLINE;
codigo: (~SPACE) (options {greedy=false;}:.)* EOF;
//regla: patron accion;